package string;

/**
 *  String不适合频繁修改。内存开销大，性能低下。
 *  为了解决这个问题，java提供了一个用于修改字符串的API:StringBuilder
 *
 *  StringBuilder内部维护一个可变的char数组，修改性能高，开销小，并且提供了便于修改
 *  字符串的额相关操作：增删改插等
 */
public class StringBuilderDemo1 {
    public static void main(String[] args) {
        String str = "好好学习java";

        //创建StringBuilder常见的构造器
        //StringBuilder builder = new StringBuilder();//内部默认表示一个空字符串
        //创建StringBuilder的同时将给定的字符串的内容复制一份到内部。
        StringBuilder builder = new StringBuilder(str);

        //StringBuffer是并发安全的，StringBuilder不是并发安全的，功能上是一致的
        //考虑线程安全的时候才用StringBuffer.
        //StringBuffer builder = new StringBuffer(str);

        /*
              增
              好好学习java
                V
              好好学习java，为了找个好工作
         */
        builder.append(",为了找个好工作!");
        System.out.println(str); //String是不变对象，内容没有发生改变
        System.out.println(builder); //改变的是StringBuilder内部字符串内容

        /*
            改
            好好学习java,为了找个好工作！
                    ^
                    V
            好好学习java,就是为了改变世界！
         */
        //将builder内部字符串从下标9开始到16(不含)的内容替换为给定的字符串
        builder.replace(9,16,"就是为了改变世界");
        System.out.println(builder);

        /*
            删
            好好学习java，就是为了改变世界！
                V
            ,就是为了改变世界
         */
        builder.delete(0,8);
        System.out.println(builder);

        /*
            插
            ,就是为改变世界！
                V
            活着,就是为了改变世界！
         */
        builder.insert(0,"活着");
        System.out.println(builder);

        //反转字符串内容
        builder.reverse();
        System.out.println(builder);

        /*
            StringBuilder只是修改字符串的工具类，并非String本事。
            当使用StringBuilder修改内容后，可以调用toString方法得到内部的字符串内容。
         */
        String line = builder.toString();
        System.out.println(line);
    }
}
